<?php
namespace app\index\controller;

/**
 * 引入必要的类和模型
 */
use think\Controller;
use app\index\model\User as UserModel;
use think\Session;

/**
 * 用户控制器类
 * 负责处理用户注册、登录、退出和修改密码等操作
 */
class User extends Controller
{
    /**
     * 用户模型实例
     * @var UserModel
     */
    protected $user;

    /**
     * 构造函数
     * 初始化控制器并实例化用户模型
     */
    public function __construct()
    {
        parent::__construct();
        $this->user = new UserModel();
    }

    /**
     * 用户注册方法
     * 处理用户注册页面的显示和表单提交
     * 
     * @return mixed 注册成功后跳转到登录页面，失败则显示错误信息
     */
    public function register()
    {
        // 检查是否为POST请求（表单提交）
        if (request()->isPost()) {
            // 获取表单提交的数据
            $data = input('post.');
            
            // 使用验证器验证提交的数据
            $validate = validate('User');
            if (!$validate->scene('register')->check($data)) {
                $this->error($validate->getError());
            }
            
            // 调用模型方法注册用户
            $result = $this->user->register($data);
            if ($result['status']) {
                $this->success('注册成功', 'user/login');
            } else {
                $this->error($result['msg']);
            }
        }
        
        // 非POST请求时显示注册页面
        return $this->fetch();
    }

    /**
     * 用户登录方法
     * 处理用户登录页面的显示和表单提交
     * 
     * @return mixed 登录成功后跳转到首页，失败则显示错误信息
     */
    public function login()
    {
        // 检查是否为POST请求（表单提交）
        if (request()->isPost()) {
            // 获取表单提交的数据
            $data = input('post.');
            
            // 使用验证器验证提交的数据
            $validate = validate('User');
            if (!$validate->scene('login')->check($data)) {
                $this->error($validate->getError());
            }
            
            // 调用模型方法验证登录
            $result = $this->user->login($data['username'], $data['password']);
            if ($result['status']) {
                // 登录成功，设置会话数据
                Session::set('user_id', $result['data']['id']);
                Session::set('username', $result['data']['username']);
                $this->success('登录成功', 'index/index');
            } else {
                $this->error($result['msg']);
            }
        }
        
        // 非POST请求时显示登录页面
        return $this->fetch();
    }

    /**
     * 退出登录方法
     * 清除用户会话数据并跳转到首页
     * 
     * @return mixed 退出成功后跳转到首页
     */
    public function logout()
    {
        // 清除所有会话数据
        Session::clear();
        $this->success('退出成功', 'index/index');
    }

    /**
     * 修改密码方法
     * 处理用户修改密码页面的显示和表单提交
     * 
     * @return mixed 密码修改成功后跳转到登录页面，失败则显示错误信息
     */
    public function changePassword()
    {
        // 检查用户是否已登录
        if (!Session::has('user_id')) {
            $this->error('请先登录', 'user/login');
        }

        // 检查是否为POST请求（表单提交）
        if (request()->isPost()) {
            // 获取表单提交的数据
            $data = input('post.');
            
            // 使用验证器验证提交的数据
            $validate = validate('User');
            if (!$validate->scene('change_password')->check($data)) {
                $this->error($validate->getError());
            }
            
            // 调用模型方法修改密码
            $result = $this->user->changePassword(
                Session::get('user_id'),
                $data['old_password'],
                $data['new_password']
            );
            
            if ($result['status']) {
                // 密码修改成功，清除会话数据，要求重新登录
                Session::clear();
                $this->success('密码修改成功，请重新登录', 'user/login');
            } else {
                $this->error($result['msg']);
            }
        }
        
        // 非POST请求时显示修改密码页面
        return $this->fetch();
    }
} 